
var configMode = true,
hostURL = "https://mu-mu.cn/xddk-php/public/index.php/",
testURL = "https://kd.mu-mu.cn/kd-php/public/index.php/",
Config = {
  /* 基础库版本 */ version: '2.4.0',
  /* 是否是调试模式 */ mode: configMode,
  /* 服务器地址 */ host: configMode ? testURL : hostURL,
  /* 控制台输出请求 */ _consoleRequest: true,
  /* 控制台输出返回 */ _consoleResult: true,
};

var appData = {
  refresh: false,   // 携参跳回页面
  refreshTab: null, // 携参跳回参数
  user: {}
};

function nav(url) { wx.navigateTo({  url: url }) }
function dir(url) { wx.redirectTo({  url: url }) }

function update() {
  if (wx.canIUse('getUpdateManager')) {
    var update = wx.getUpdateManager(), that = this;
    update.onCheckForUpdate(function (res) {
      if (res.hasUpdate) {
        update.onUpdateReady(function () {
          modal('更新提示', '新版本已经准备好啦').then(res => {
            update.applyUpdate();
          })
        })
        update.onUpdateFailed(function () {
          modal('新版本下载失败',
            '发现新版本小程序，请您在“最近使用”下拉栏中删除当前小程序，重新搜索以使用新版本。'
          ).then(res => {
            wx.navigateBack({ delta: 9 });
          })
        })
      }
    })
  };
}
/** 封装get网络请求
 * @param {string}  method  目标方法
 * @param {func}    cb      回调函数
 * @param {string}  laoding 加载弹窗
 */
function get(method, cb, loading) {
  if (loading) wx.showLoading({ title: loading, mask: true });
  wx.request({
    url: wx.Config.host + method,
    success: res => {
      if (loading) wx.hideLoading();
      if (wx.Config._consoleRequest) {
        console.group(method);
        if (wx.Config._consoleResult) console.log(res.data)
        console.groupEnd();
      }
      if (cb) return cb(res.data);
    },
    fail() {
      toast('网络连接失败，请稍后再试。')
    }
  })
}
/** 封装post网络请求
 * @param {string}  method  目标方法
 * @param {obj}     data    携带参数
 * @param {func}    cb      回调函数
 * @param {string}  laoding 加载弹窗
 */
function post(method, data, cb, loading) {
  if (loading) wx.showLoading({ title: loading, mask: true });
  data = data || {}, 
  wx.request({
    url: wx.Config.host + method,
    data: data,
    method: 'POST',
    header: { 'content-type': 'application/json' },
    success: res => {
      if (loading) wx.hideLoading();
      if (wx.Config._consoleRequest) {
        console.group(method + ':', data);
        if (wx.Config._consoleResult) console.log(res.data)
        console.groupEnd();
      }
      if (cb) return cb(res.data);
    },
    fail() {
      toast('网络连接失败，请检查网络配置或账户安全。')
    }
  })
}
/** 封装云函数请求
 * @param {string}  url   目标函数
 * @param {obj}     data  携带参数
 * @param {func}    cb    回调函数
 * @param {func}    cb1   失败回调函数
 * @param {string}  log   是否弹出加载
 */
function call(url, data, cb, cb1, loading) {
  if (loading) wx.showLoading({ title: loading });
  data = data || {};
  wx.cloud.callFunction({
    name: url,
    data: data,
    success: res => {
      if (loading) wx.hideLoading();
      if (wx.Config._consoleRequest) {
        console.group(url + ':', data);
        if (wx.Config._consoleResult) console.log(res.result)
        console.groupEnd();
      }
      if (cb) return cb(res);
    },
    fail(res) {
      if (cb1) return cb1(res);
      toast('云函数调用失败，请稍候再试。');
      console.warn(res)
    }
  })
}
/** 封装模态提示
 * @param {str} title   标题，默认为提示
 * @param {str} content 内容
 * @param {str} l     取消文本，默认为取消
 * @param {str} r     确认文本，默认为好的
 * @param {str} cb0   取消回调
 * @param {str} cb1   确认回调
 */
function modal(title, content, l, r, l_clr, r_clr, cb0, cb1) {
  wx.showModal({
    title: title || '提示',
    content: content,
    showCancel: l == null ? false : true,
    cancelText: l == null ? '取消' : l,
    confirmText: r || '好的',
    cancelColor: l_clr || '',
    confirmColor: r_clr || '',
    success: res => {
      if (res.confirm && cb0) return cb0(res);
      else if (cb1) return cb1(res);
    }
  })
}
/** 封装 toast 提示
 * @param {str}  content 提示文本 
 * @param {str}  icon    提示图标，默认无
 * @param {bool} mask    是否有 mask
 * @param {str}  duration 时长
 */
function toast(content, icon, mask, cb, duration) {
  icon = icon ? 'success' : 'none';
  wx.showToast({
    title: content,
    icon: icon,
    image: '',
    duration: duration || 2000,
    mask: mask ? true : false,
    success: res => { 
      if (cb) setTimeout(() => {
        return cb(res)
      }, duration || 2000 )
    },
  });
  return 0;
}
/**
 * 定义全局的转发函数
 * 希望用户通过分享窗口进入小程序时能先通过预加载页面获取登录信息等
 */
function onShareAppMessage (){
  return {
    path: '/pages/home/preload/preload',
  }
}
/***************** 以下是工具类函数封装 *********************/
/**
 * 转换字符串，输出 10 位时间戳
 * @return {str} timestamp 时间戳
 */
function gmt(str) {
  let date = str ? new Date(str) : new Date();
  return parseInt(date.getTime() / 1000).toString();
};

/**
 * 转换 16 进制 rgb 为 10 进制数字输出
 * @return {arr[int]} res 颜色值
 */
function rgb(str) {
  let res = [0, 0, 0], i = -1;
  if (str[0] == '#') str = str.substring(1)
  if (str[6]) 
    console.error('字符串不对');
  else for (; i++ < 2;) 
    res[i] = parseInt(str.substr(2 * i, 2), 16);
  return res;
};

/**
 * 封装 formatTime
 * @param  {int} timestamp 时间戳
 * 
 * @param  {dt}  date      时间
 * @param  {str} type      格式化类型
 * @return {str} formatted date & time
 */
function formatTime(date, type) {
  var year = date.getFullYear(),
    month = formatNumber(date.getMonth() + 1),
    day = formatNumber(date.getDate()),
    hours = formatNumber(date.getHours()),
    minute = formatNumber(date.getMinutes()),
    second = formatNumber(date.getSeconds());
  switch (type) {
    case 'cn':
      return year + '年' + month + '月' + day + '日 ' +
        hours + '时' + minute + '分' + second + '秒';
    case 'd-t':
      return ([year, month, day]).join('-') + ' ' +
        ([hours, minute, second]).join(':');
    case 'd/t':
      return ([year, month, day]).join('/') + ' ' +
        ([hours, minute, second]).join(':');
    case '-':
      return ([year, month, day]).join('-');
    case '/':
      return ([year, month, day]).join('/');
  }
  return ([hours, minute, second]).join(':');
}
const formatNumber = n => {
  n = n.toString(); return n[1] ? n : '0' + n;
}

function random(n) {
  const wordList = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
  'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2',
  '3', '4', '5', '6', '7', '8', '9', '0']
  var result = ''
  for (let i=0; i<n; i++) {
    result += wordList[Math.floor(Math.random() * 36)]
  }
  return result
}

function initialize() {
  update();
  // wx.cloud.init();
  Config.client = typeof (qq) == "object" ? 0 : 1;
  wx.Config = Config,
    wx.get = get,
    wx.post = post,
    wx.call = call,
    wx.modal = modal,
    wx.toast = toast,
    wx.dir = dir,
    wx.nav = nav;
    wx.appData = appData;
    wx.onShareAppMessage = onShareAppMessage;

    wx.formatTime = formatTime;
    wx.gmt = gmt;
    wx.rgb = rgb;
    wx.random = random;
  // if (!wx.cloud) modal('请升级微信', '最低基础库版本：' + Config.version)
  // else wx.cloud.init({ 
  //   traceUser: true,
  //   env: 'pm-cloud'
  // })
}


module.exports = {
  initialize: initialize
}
